Add /blog-next: the pipeline had no owner for what to write - #580
Merged
Conversation
The blog pipeline had no owner for topic selection. Any request to write a post entered at the draft step, so a decayed queue row or a dedup collision was only discovered after a draft existed. /blog-next owns Stage A (generate candidates, then audit them), Stage B (research primary sources) and Stage C (outline + gate), and hands a gated outline to blog-post-coordinator. It never writes a post. The load-bearing rule, learned from two audits that falsified the queue's own lead item: search demand cannot GENERATE topics on this property, it can only VETO them. The blog earns ~0.69 named non-brand clicks/day and the ICP is absent from the query data, so a search-driven queue returns HOLD forever. .gitignore needed three fixes for the skill to ship at all: the directory was ignored as claude-flow scaffolding, a directory negation does not cover file-pattern rules matching deeper, and `.claude/**/*.json` still swallowed evals.json inside an un-ignored directory. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
Both blog agents now accept a gated outline from upstream instead of re-deriving the topic, and blog-batch-orchestrator reads §13 (§12 was retired but still referenced). blog-pipeline.md gains STEP 4e - SELF-CRITIQUE (BLOCKING): reflexion-reflect before the critic panel. That gate was already live in the LinkedIn and course lanes and simply absent from the blog lane, which is the lane with the most voice-sensitive output. CLAUDE.md fixes a collision that could silently invert a gate: "slop >= 8/10" (blog, higher is better) and "Slop <= 25" (course, 0-100, lower is better) were both written as "the slop gate". Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
A loop whose only outcomes are SHIPPED and ITERATE will always ship something. Stopping feels like failing, so the loop manufactures a post. Three exits: SHIPPED, HOLD-with-evidence (a terminal SUCCESS, not a failure), BLOCKED on a named decision. Evidence this is not theoretical: on 2026-08-22 two /blog-next runs correctly ended in HOLD. The groomed queue's lead row was an artifact (a 52x "finding" that factorises to 1.4x clicks x 37.2x impressions), and its same-day replacement failed dedup. A two-exit loop would have written both. The completion promise must be about GATES, never about quality. A promise containing "the post is good" is unfalsifiable, and an agent under loop pressure will assert it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
…uled 20.09 gains §13d/e/f, each recording the number that killed a row so nobody re-proposes it from intuition next quarter. - §13d: N2 FALSIFIED. Its 52x is a denominator, not a reader response - (c1/i1)/(c2/i2) factorises to 1.4x clicks x 37.2x impressions. N3's addressable volume corrected 6,895 -> ~550 (synthetic query family). - §13e: §13d's own replacement retracted - one query, already won, ceiling +0.13 clicks/day. Demand floor introduced: 0.69 non-brand clicks/day. - §13f: N7 "how AI helps developers" DO-NOT-WRITE (61-slug saturation with six shipped near-duplicate pairs, 180 query rows at zero clicks, and it addresses developers where the ICP is a non-technical founder). N8 `vertical ai agents` FLAG-not-write - the first row whose arithmetic clears the floor, still not worth a slot. N9 SCHEDULED. analytics-access.md gains the traps these pulls earned: Trap C (page position is an artifact whenever the CTR is), Trap D (query-vs-query is the legitimate comparison level), the synthetic-query-family tell, and Trap A generalised - a FILTER truncates a denominator as readily as a row limit, and `has_more: false` means complete GIVEN THE FILTER. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
The draft opened with a parable and reached the idea in beat 3. Influencer
posts in this lane (Cutler, Rossi, Holub) open with the claim and use the
anecdote as evidence. Rewritten to that skeleton: 141 words, zero em dashes.
reflexion-reflect caught three defects before handback that self-review
had passed: a slogany flip ("does the opposite. It refuses work"), "explicitly
rejected" where the notes say "deferred", and an unverifiable "The same morning".
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
The row "how to structure team with AI harnesses without losing the control" collides near-totally with claude-code-xp-team-workflow (2026-05-04), which already carries the roles, the cadences, and the arbitration rule. Recorded as an UPGRADE with the material the published post predates: three exits rather than two, HOLD as a terminal success, author≠verifier as a different agent TYPE, and four errors the gates caught that self-review passed. Job declared arrival-purposed, so the search floor does not apply - quoting it would be the category error §13e warns about. Stated in the section: this verdict rests on READING the post, not on a measurement chain, so it did not go through the Stage A reviewer gate that §13d/e/f verdicts did. Flagged so nobody later cites it as gate-passed. The verdict had been reported in chat only, which the async-first rule forbids - a task is not done until a cold session can read its state with zero questions. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
Contributor
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Topic selection had no owner. Any request to write a post entered the pipeline at the draft step, so a decayed queue row or a dedup collision was only discovered after a draft existed. This adds the missing half and records what three live GSC pulls did to the queue.
Docs, skills and
.okf/only — nocontent/, no templates, no CSS. Per #577, docs-only merges on local gates.Per commit
Add the /blog-next skill— Stage A (generate candidates, then audit them), Stage B (research), Stage C (outline + gate). Never writes a post; hands a gated outline toblog-post-coordinator.The load-bearing rule, learned from two audits that falsified the queue's own lead item: search demand cannot generate topics on this property, it can only veto them. The blog earns ~0.69 named non-brand clicks/day and the ICP is absent from the query data, so a search-driven queue returns HOLD forever.
.gitignoreneeded three fixes for the skill to ship at all: the directory was ignored as claude-flow scaffolding; a directory negation does not cover file-pattern rules matching deeper; and.claude/**/*.jsonstill swallowedevals.jsoninside the un-ignored directory. Caught by peer review, not by me —git check-ignore -vreturns exit 0 on an un-ignored file, so it reads as confirmation either way.git status --untracked-files=allis the reliable check.Wire /blog-next into the pipeline— both blog agents now accept a gated outline instead of re-deriving the topic; the batch orchestrator reads §13 (§12 was retired but still referenced).Adds STEP 4e — SELF-CRITIQUE (BLOCKING):
reflexion-reflectbefore the critic panel. Already live in the LinkedIn and course lanes, simply absent from the blog lane — the lane with the most voice-sensitive output.Fixes a gate-inverting collision in CLAUDE.md:
slop >= 8/10(blog, higher better) andSlop <= 25(course, 0-100, lower better) were both written as "the slop gate".Content can run unattended, but only with three exits— SHIPPED / HOLD-with-evidence (a terminal success) / BLOCKED on a named decision. A two-exit loop always ships, because stopping feels like failing.Not theoretical: two
/blog-nextruns this day correctly ended in HOLD. A two-exit loop writes both posts. The completion promise must be about gates, never quality — a promise containing "the post is good" is unfalsifiable, and an agent under loop pressure will assert it.Three live GSC pulls— §13d/e/f, each recording the number that killed a row:(c1/i1)/(c2/i2)factorises to 1.4x clicks × 37.2x impressions. N3's addressable volume corrected 6,895 → ~550 (synthetic query family).vertical ai agentsFLAG-not-write — the first row whose arithmetic clears the demand floor, and still not worth a slot: family decaying 2x, SERP held by Salesforce/IBM/Google, our asset a 3-minute dev.to import.analytics-access.mdgains the traps these pulls earned: Trap C (page position is an artifact whenever the CTR is), Trap D (query-vs-query is the legitimate comparison level), the synthetic-query-family tell, and Trap A generalised — a filter truncates a denominator as readily as a row limit, andhas_more: falsemeans complete given the filter. Both generalisations came from my own errors this session, documented in §13f.Rewrite bip-agents post idea-first— opened with a parable and reached the idea in beat 3; influencers in this lane open with the claim. 141 words, zero em dashes.reflexion-reflectcaught three defects self-review had passed: a slogany flip, "explicitly rejected" where the notes say "deferred", and an unverifiable "The same morning".§13g— Paul's "structure a team with AI harnesses" row resolves to UPGRADEclaude-code-xp-team-workflow, not a new post. Stated in the section: that verdict rests on reading the post, not a measurement chain, so it did not pass the Stage A reviewer gate the other verdicts did — flagged so nobody later cites it as gate-passed.Gates
bin/hugo-build— green, 1181 pages, no errors.Review links
http://localhost:<session port>/linkedin/personal/bip-agents-cancelled-own-backlog/🤖 Generated with Claude Code
https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg